{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true,
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "# 好坏质检分类实战task：\n",
    "1. 基于data_class_raw.csv数据，根据高斯分布概率密度函数，寻找异常点并剔除\n",
    "+ 基于data_class_processed.csv数据，进行PCA处理，确定重要数据维度及成分\n",
    "+ 完成数据分离，数据分离参数：random_state=4,test_size=0.4\n",
    "+ 建立KNN模型完成分类，n_neighbors取10，计算分类准确率，可视化分类边界\n",
    "+ 计算测试数据集对应的混淆矩阵，计算准确率、召回率、特异度、精确率、F1分数\n",
    "+ 尝试不同的n_neighbors（1-20）,计算其在训练数据集、测试数据集上的准确率并作图"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "pycharm": {
     "is_executing": false,
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>x1</th>\n",
       "      <th>x2</th>\n",
       "      <th>y</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.77</td>\n",
       "      <td>3.97</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1.71</td>\n",
       "      <td>2.81</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2.18</td>\n",
       "      <td>1.31</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>3.80</td>\n",
       "      <td>0.69</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5.21</td>\n",
       "      <td>1.14</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     x1    x2  y\n",
       "0  0.77  3.97  0\n",
       "1  1.71  2.81  0\n",
       "2  2.18  1.31  0\n",
       "3  3.80  0.69  0\n",
       "4  5.21  1.14  0"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#加载数据\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "data = pd.read_csv('data_class_raw.csv')\n",
    "data.head()\n",
    "\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "pycharm": {
     "is_executing": false,
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>x1</th>\n",
       "      <th>x2</th>\n",
       "      <th>y</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.77</td>\n",
       "      <td>3.97</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1.71</td>\n",
       "      <td>2.81</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2.18</td>\n",
       "      <td>1.31</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>3.80</td>\n",
       "      <td>0.69</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5.21</td>\n",
       "      <td>1.14</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     x1    x2  y\n",
       "0  0.77  3.97  0\n",
       "1  1.71  2.81  0\n",
       "2  2.18  1.31  0\n",
       "3  3.80  0.69  0\n",
       "4  5.21  1.14  0"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#加载数据\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "data = pd.read_csv('data_class_raw.csv')\n",
    "data.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "pycharm": {
     "is_executing": false,
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "#define X and y\n",
    "X = data.drop(['y'],axis=1)\n",
    "y = data.loc[:,'y']\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "pycharm": {
     "is_executing": false,
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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5Oabb778PzCE3YLPP/98rrvuurzwwgt5xzvekUceeSRvectbrupzXsqFvuZSytO11m3nv9eZKwBguLbsvuqYOt+9996br3zlK3nxxRdz9913DzWslktcAQBj52Mf+1jXU7goC9oBABpy5gqAkXDo6Gz2HT6ek3P9rJvuZc+OTdm1dX3X04JlE1cAdO7Q0dnsPXgs/fkzSZLZuX72HjyWJAKLseOyIACd23f4+NmwWtSfP5N9h493NCO4cuIKgM6dnOsvaxy++tWvZvPmzSv+Zy+HuAKgc+ume8sah1EmrgDo3J4dm9KbWrNkrDe1Jnt2bOpoRrR06OhsbvvQp3PTBz6V2z706Rw6Otvk87700ku5++67s2XLlvzgD/5gXnjhhTz44IO59dZbs3nz5tx7771nn0P49NNP581vfnPe9ra35dd+7deaHP9ixBUAndu1dX0euvOWrJ/upSRZP93LQ3feYjH7BFjcrDA710/Ny5sVWgTW8ePHc++992ZmZiavfe1r8+u//ut5//vfny984Qv58pe/nH6/n09+8pNJknvuuSf79+/P5z73uas+7iuxWxCAkbBr63oxNYEutVnhar/fGzduzG233ZYkee9735v9+/fnpptuyi/+4i/mhRdeyDe+8Y187/d+b97xjndkbm4ud9xxR5Lkrrvuyu/+7u9e1bEvRVwBAEMzzM0KpZTv+PgnfuIncuTIkWzcuDEPPPBAXnzxxdRav+O9w+SyIE0N67o6AONpmJsVvva1r529zPfxj388t99+e5Lk+uuvz/PPP5/HH388STI9PZ21a9fmqaeeSpI89thjV33sSxFXNDPM6+oAjKdhbla4+eab8+EPfzhbtmzJN77xjfz4j/94fvRHfzS33HJLdu3alVtvvfXsex999NH85E/+ZN72trel1xvuLtSyuIp+FGzbtq0eOXKk62lwhW770Kcze4HTvOune/nXH3hnBzMCYBieeeaZ3HzzzZf9/kl4tNGFvuZSytO11m3nv9eaK5pxE0AALmS1bVZwWZBm3AQQAMQVDbkJIMDqMUrLioZtuV+ruKIZNwEEWB2uvfbaPPfcc6sisGqtee6553Lttdde9p+x5oqmVtt1dYDVaMOGDTlx4kROnTrV9VRWxLXXXpsNGzZc9vvFFQCwLFNTU7npppu6nsbIclkQAKAhcQUA0JDLgiNgEm6u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\n",
      "text/plain": [
       "<Figure size 720x720 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#可视化数据\n",
    "%matplotlib inline\n",
    "from matplotlib import pyplot as plt\n",
    "fig1 = plt.figure(figsize=(10,10))\n",
    "bad = plt.scatter(X.loc[:,'x1'][y==0],X.loc[:,'x2'][y==0])\n",
    "good = plt.scatter(X.loc[:,'x1'][y==1],X.loc[:,'x2'][y==1])\n",
    "plt.legend((good,bad),('good','bad'))\n",
    "plt.title('raw data')\n",
    "plt.xlabel('x1')\n",
    "plt.ylabel('x2')\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "pycharm": {
     "is_executing": false,
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[ 1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1 -1]\n"
     ]
    }
   ],
   "source": [
    "#异常检测\n",
    "from sklearn.covariance import EllipticEnvelope\n",
    "ad_model = EllipticEnvelope(contamination=0.02)\n",
    "ad_model.fit(X[y==0])#只给坏的数据样本学习\n",
    "y_predict_bad = ad_model.predict(X[y==0])#预测异常点\n",
    "print(y_predict_bad)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "pycharm": {
     "is_executing": false,
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 360x360 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#可视化异常点\n",
    "fig2 = plt.figure(figsize=(5,5))\n",
    "bad = plt.scatter(X.loc[:,'x1'][y==0],X.loc[:,'x2'][y==0])\n",
    "good = plt.scatter(X.loc[:,'x1'][y==1],X.loc[:,'x2'][y==1])\n",
    "#画异常点\n",
    "plt.scatter(X.loc[:,'x1'][y==0][y_predict_bad==-1],X.loc[:,'x2'][y==0][y_predict_bad==-1],marker='x',s=150)\n",
    "\n",
    "plt.legend((good,bad),('good','bad'))\n",
    "plt.title('raw data')\n",
    "plt.xlabel('x1')\n",
    "plt.ylabel('x2')\n",
    "plt.show()\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "# 2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "pycharm": {
     "is_executing": false,
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "data = pd.read_csv('data_class_processed.csv')\n",
    "data.head()\n",
    "#define X and y\n",
    "X = data.drop(['y'],axis=1)\n",
    "y = data.loc[:,'y']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "pycharm": {
     "is_executing": false,
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[0.5369408 0.4630592]\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 360x360 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#pca \n",
    "from sklearn.preprocessing import StandardScaler\n",
    "from sklearn.decomposition import PCA\n",
    "X_norm = StandardScaler().fit_transform(X)\n",
    "pca = PCA(n_components=2)\n",
    "X_reduced = pca.fit_transform(X_norm)\n",
    "var_ratio = pca.explained_variance_ratio_\n",
    "print(var_ratio) #标准差比例\n",
    "fig4 = plt.figure(figsize=(5,5))\n",
    "plt.bar([1,2],var_ratio)\n",
    "plt.show()\n",
    "#两个数据都要保留"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "## 3 数据分离"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "pycharm": {
     "is_executing": false,
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(21, 2) (14, 2) (35, 2)\n"
     ]
    }
   ],
   "source": [
    "#数据分离\n",
    "from sklearn.model_selection import train_test_split\n",
    "X_train,X_test,y_train,y_test = train_test_split(X,y,random_state=4,test_size=0.4) \n",
    "print(X_train.shape,X_test.shape,X.shape)#数据维度"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "原始数据被拆成了测试数据和训练数据"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "is_executing": false,
     "name": "#%% md\n"
    }
   },
   "source": [
    "# 根据训练数据集建立KNN模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "from sklearn.neighbors import KNeighborsClassifier\n",
    "knn_10=KNeighborsClassifier(n_neighbors=10)\n",
    "knn_10.fit(X_train,y_train)\n",
    "y_train_predict=knn_10.predict(X_train)\n",
    "y_test_predict=knn_10.predict(X_test)\n",
    "\n",
    "#计算准确率\n",
    "from sklearn.metrics import accuracy_score\n",
    "accuracy_train=accuracy_score(y_train,y_train_predict)\n",
    "accuracy_test=accuracy_score(y_test,y_test_predict)\n",
    "print(\"training accuracy:\",accuracy_train)\n",
    "print(\"testing accuracy:\",accuracy_test)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "### 可视化分类边界"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "pycharm": {
     "is_executing": false,
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(200, 200)\n"
     ]
    }
   ],
   "source": [
    "#生成填充数据\n",
    "xx,yy=np.meshgrid(np.arange(0,10,0.05),np.arange(0,10,0.05)) #生成对应的数据组合\n",
    "print(yy.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "pycharm": {
     "is_executing": false,
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(40000, 2)\n"
     ]
    }
   ],
   "source": [
    "#转换成两列\n",
    "x_range = np.c_[xx.ravel(),yy.ravel()] \n",
    "print(x_range.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "pycharm": {
     "is_executing": false,
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "#预测\n",
    "y_range_predict=knn_10.predict(x_range)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "pycharm": {
     "is_executing": false,
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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5QJd+/mvH7zNhNeeouuX/KtOOOuvdPJ579eLLQNfpPsPGzfp5PPer5Pedqk+/eWbNeG1p0iSnHO65nNf0/FnvEtzz1yke36yQrKK7u3XXKPjjz9ec+fO1T333HPw9h/5yEc0Z84cnXvuudq2bVtRHm/UjRcNw9g05RvVeOAm7XQTQpcCACiFVbdKuf19t+X2d28vgmee26h3/M01uu2rN6hhymSte+r3uufmJXry5/fqnqafadOWFyRJL7W16+QT5+qJR+7RqSefqG/fdd+A97n401/W4iveo1U/vVMzDm84uH35Tx/Vuqd+rycevluP3H2zrvn8UjW/2KLly5dr3bp1euKJJ/TII4/ommuuUXNzs+677z4988wzevLJJ/Xtb39bjz/+eFEec9SNF+H64phC0B4AytO+AVZ5Bto+Ai07dumCD16tO//l83r98cdKks5sfKPqJk1UdfU4zTnmaP1xS7MkqaqqUuedfaok6Q1zj9PGzVsHvN9fr3lS7zrvLEnSey5668HtK/9rrS65cKEqKip0eMNhOu3kE7Vq3ZNauXKlLrnkku7thx+u0047TatWrdJjjz12cPuMGTN0xhlnjPkxS5E3XoTri6Mr7n9GAFC+JgxwMe2Bto9A3cQJOnLG4frPVesObhtX9XIEqCKTUS7XfdZhZTYr63nPrqioOLh9JNwAh7kG2i7p4D6LKep3TML1xZFRPnQJAIBSOOkKKTuu77bsuO7tY1RVVakff+er+u6yB/X9+x4a8/0VnHziXP3owZ9Lku7+yYqD2089+UTd0/QzdXV1qWXHLj32m9/qja//c5166qm65557ure3tOixxx7TG9/4Rp166qm6++671dXVpebmZv3iF78oSn3ZotxLSk2urdSuNg43jtVWN1WzbHvoMgAAxfbas7v/v+rW7sOLE6Z1N12F7WM0vrZGD9yxVGdf8ne69OK3FeU+v/7Z/61LP/oP+udb7tS5ZzaqblJ3Dvmic87Qr9es1wlnv1tmphuvX6wjDj9cF51wln7961/rhBNO6N5+44064ogjdNFFF+nRRx/V3Llzdcwxx+i0004rSn022BJbUixYsMCtXr266Pf7+s/+jJxXEZyfWakllbeq1g6ELgUAMIQNC+/VcUeN/VBhUrW1t6umulpmprt/skI/+PG/6ye3fa3/G1uFNH3emPa3YcMGHXfccX3v1myNc25Bf7ePesWLpqs4mvKNUqe0tPKbIjYHAAhpzfoN+sj1X5KTU/2kifrOP39m4BsHmFwfdeNVYUbOq0ia8o36qr6lLHkvAIAHX1h6q374wCN9tr3rvLN0/eIr9MQj9wSqamhRN140XcVFyB4A4Mv1i6/Q9YvHHvL3LeqzGplcX1xJun7jg+Nr9ZZZMzRv9pF6y6wZenB8beiSAABJYxXedxl148WCV3El5fqND46v1Q1Tp6i5MitnpubKrG6YOoXmCwAQXNSNF+H64krK9RuXTq5XR6bvP+2OTEZLJ9cHqggAkEgBwvVRN15Mri++wvUbQ06zfyHb/9LxQNsBAPAl6saLcH3phAzaHzHApSQG2g4AGNiPn2nTKbe9qFfftFWn3PaifvxM25jvc+OmrTr+jHcVobpXuvxjn9GyQ852HNH3X365li1bVsSK+oq68SJcXzqtmhBs34t3tao637fxq87ntXhXa6CKACCdfvxMmz75893asrdLTtKWvV365M93F6X5SgTC9X6x4FU6IX+2577Uphu279T0zpzMOU3vzOmG7Tt17ktl8kIBAJ58+fG9as/1fUFvzzl9+fG9RdvH83/crPlvuURfvvkOXXzFJ/TW935Yrz3lAl37+a8fvM2E156i65f8q04466908nnv14stOwa9z0d+9Rv9r4s+qGMaL9QDDz8mqXuV7X9d9EGduPA9OnHhe/T4qickdV8k+yMf+YjmzJmjc889V9u2bSvaY+tP1I0X4frSmWz7gu7/3Jfa9LPNW7V+4yb9bPNWmi4AGIWte/uPaAy0faSeeW6j3vE31+i2r96ghimTte6p3+uem5foyZ/fq3uafqZNW16QJL3U1q6TT5yrJx65R6eefKK+fdd9g97vxs1b9R8/ulUPfvcmXXXd/1FHx35NmzpZD//gZv12xfd1z81L9NFP3yi5Lt1333165pln9OSTT+rb3/62Hn/88aI8toFE3XgRri+dJM30AgCMzoyJ/R+KG2j7SLTs2KULPni17vyXz+v1xx8rSTqz8Y2qmzRR1dXjNOeYo/XHLc2SpKqqSp139qmSpDfMPU4bN28d9L4Xvf1sZTIZvfboV+noo2bqd89tVGdnTn9zzec098xFetffXqunf/8/kqTHHntMl1xyiSoqKjRjxgydccYZY35sg4m68SJcP3zZSWs1/jVL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\n",
      "text/plain": [
       "<Figure size 720x720 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#画图\n",
    "fig4 = plt.figure(figsize=(10,10))\n",
    "knn_bad = plt.scatter(x_range[:,0][y_range_predict==0],x_range[:,1][y_range_predict==0])\n",
    "knn_good = plt.scatter(x_range[:,0][y_range_predict==1],x_range[:,1][y_range_predict==1])\n",
    "\n",
    "\n",
    "bad = plt.scatter(X.loc[:,'x1'][y==0],X.loc[:,'x2'][y==0])\n",
    "good = plt.scatter(X.loc[:,'x1'][y==1],X.loc[:,'x2'][y==1])\n",
    "plt.legend((good,bad,knn_good,knn_bad),('good','bad','knn_good','knn_bad'))\n",
    "plt.title('prediction result')\n",
    "plt.xlabel('x1')\n",
    "plt.ylabel('x2')\n",
    "plt.show()\n",
    "\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "# 5 混淆矩阵"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "pycharm": {
     "is_executing": false,
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[4 2]\n",
      " [3 5]]\n",
      "5 4 2 3\n"
     ]
    }
   ],
   "source": [
    "from sklearn.metrics import confusion_matrix\n",
    "cm = confusion_matrix(y_test,y_test_predict)\n",
    "print(cm)\n",
    "TP = cm[1,1]\n",
    "TN = cm[0,0]\n",
    "FP = cm[0,1]\n",
    "FN = cm[1,0]\n",
    "print(TP,TN,FP,FN)\n",
    "  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "pycharm": {
     "is_executing": false,
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.6428571428571429\n"
     ]
    }
   ],
   "source": [
    "#准确率\n",
    "accuracy = (TP + TN)/(TP + TN + FP + FN)\n",
    "print(accuracy)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "pycharm": {
     "is_executing": false,
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.625\n"
     ]
    }
   ],
   "source": [
    "#灵敏度\n",
    "recall = TP/(TP + FN)\n",
    "print(recall)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {
    "pycharm": {
     "is_executing": false,
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.6666666666666666\n"
     ]
    }
   ],
   "source": [
    "#特异度\n",
    "specificity = TN/(TN + FP)\n",
    "print(specificity)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {
    "pycharm": {
     "is_executing": false,
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.7142857142857143\n"
     ]
    }
   ],
   "source": [
    "#精确率\n",
    "precision = TP/(TP + FP)\n",
    "print(precision)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {
    "pycharm": {
     "is_executing": false,
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.6666666666666666\n"
     ]
    }
   ],
   "source": [
    "#F1分数\n",
    "F1 = 2*precision*recall/(precision+recall)\n",
    "print(F1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "## 调整参数看准确率"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {
    "pycharm": {
     "is_executing": false,
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[1.0, 1.0, 1.0, 1.0, 1.0, 0.9523809523809523, 0.9523809523809523, 0.9523809523809523, 0.9047619047619048, 0.9047619047619048, 0.9047619047619048, 0.9523809523809523, 0.9047619047619048, 0.9047619047619048, 0.9523809523809523, 0.9047619047619048, 0.9047619047619048, 0.5714285714285714, 0.5714285714285714, 0.5714285714285714] [0.5714285714285714, 0.5, 0.5, 0.5714285714285714, 0.7142857142857143, 0.5714285714285714, 0.5714285714285714, 0.5714285714285714, 0.6428571428571429, 0.6428571428571429, 0.6428571428571429, 0.5714285714285714, 0.6428571428571429, 0.6428571428571429, 0.5714285714285714, 0.5714285714285714, 0.5714285714285714, 0.42857142857142855, 0.42857142857142855, 0.42857142857142855]\n"
     ]
    }
   ],
   "source": [
    "#尝试不同的n_neighbors（1-20）,计算其在训练数据集、测试数据集上的准确率并作图\n",
    "n = [i for i in range(1,21)]\n",
    "accuracy_train = []\n",
    "accuracy_test = []\n",
    "for i in n:\n",
    "    knn = KNeighborsClassifier(n_neighbors=i)\n",
    "    knn.fit(X_train,y_train)\n",
    "    y_train_predict = knn.predict(X_train)\n",
    "    y_test_predict = knn.predict(X_test)\n",
    "    accuracy_train_i = accuracy_score(y_train,y_train_predict)\n",
    "    accuracy_test_i = accuracy_score(y_test,y_test_predict)\n",
    "    accuracy_train.append(accuracy_train_i)\n",
    "    accuracy_test.append(accuracy_test_i)\n",
    "print(accuracy_train,accuracy_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {
    "pycharm": {
     "is_executing": false,
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 864x360 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig5 = plt.figure(figsize=(12,5))\n",
    "plt.subplot(121)\n",
    "plt.plot(n,accuracy_train,marker='o')\n",
    "plt.title('training accuracy vs n_neighbors')\n",
    "plt.xlabel('n_neighbors')\n",
    "plt.ylabel('accuracy')\n",
    "plt.subplot(122)\n",
    "plt.plot(n,accuracy_test,marker='o')\n",
    "plt.title('testing accuracy vs n_neighbors')\n",
    "plt.xlabel('n_neighbors')\n",
    "plt.ylabel('accuracy')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "n_neighbors越大 准确率越低\n",
    "\n",
    "中间效果比较好"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "\n"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "PyCharm (Learning)",
   "language": "python",
   "name": "pycharm-bd849f12"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.7"
  },
  "pycharm": {
   "stem_cell": {
    "cell_type": "raw",
    "source": [],
    "metadata": {
     "collapsed": false
    }
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}